<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vRlYREbiNMpyS3JPRfzxi884LRqVhIxMOOkgMXQFcmigvQlQ1Rab4D33Rw7ABAdh9ZHFiCheQkEqKNL/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG minutes - September 6th 2019</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG minutes - September 6th 2019</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">.lst-kix_69lh9mjvobix-2>li:before{content:"-  "}.lst-kix_t4weiblbsu2z-2>li:before{content:"-  "}.lst-kix_t4weiblbsu2z-3>li:before{content:"-  "}.lst-kix_69lh9mjvobix-1>li:before{content:"-  "}.lst-kix_69lh9mjvobix-3>li:before{content:"-  "}.lst-kix_t4weiblbsu2z-0>li:before{content:"-  "}.lst-kix_t4weiblbsu2z-4>li:before{content:"-  "}.lst-kix_69lh9mjvobix-6>li:before{content:"-  "}.lst-kix_69lh9mjvobix-5>li:before{content:"-  "}.lst-kix_69lh9mjvobix-4>li:before{content:"-  "}.lst-kix_t4weiblbsu2z-1>li:before{content:"-  "}.lst-kix_69lh9mjvobix-0>li:before{content:"-  "}ul.lst-kix_69lh9mjvobix-8{list-style-type:none}ul.lst-kix_r24wq59i6ga6-8{list-style-type:none}ul.lst-kix_r24wq59i6ga6-5{list-style-type:none}ul.lst-kix_r24wq59i6ga6-4{list-style-type:none}ul.lst-kix_r24wq59i6ga6-7{list-style-type:none}.lst-kix_yyr651cmrtx7-0>li:before{content:"-  "}ul.lst-kix_r24wq59i6ga6-6{list-style-type:none}ul.lst-kix_69lh9mjvobix-1{list-style-type:none}ul.lst-kix_69lh9mjvobix-0{list-style-type:none}ul.lst-kix_69lh9mjvobix-3{list-style-type:none}ul.lst-kix_69lh9mjvobix-2{list-style-type:none}ul.lst-kix_69lh9mjvobix-5{list-style-type:none}ul.lst-kix_69lh9mjvobix-4{list-style-type:none}ul.lst-kix_69lh9mjvobix-7{list-style-type:none}ul.lst-kix_69lh9mjvobix-6{list-style-type:none}.lst-kix_69lh9mjvobix-7>li:before{content:"-  "}.lst-kix_69lh9mjvobix-8>li:before{content:"-  "}ul.lst-kix_6mvjq2nlb9mn-2{list-style-type:none}ul.lst-kix_6mvjq2nlb9mn-1{list-style-type:none}ul.lst-kix_6mvjq2nlb9mn-0{list-style-type:none}ul.lst-kix_t4weiblbsu2z-1{list-style-type:none}ul.lst-kix_t4weiblbsu2z-0{list-style-type:none}ul.lst-kix_6mvjq2nlb9mn-6{list-style-type:none}ul.lst-kix_6mvjq2nlb9mn-5{list-style-type:none}ul.lst-kix_6mvjq2nlb9mn-4{list-style-type:none}ul.lst-kix_6mvjq2nlb9mn-3{list-style-type:none}ul.lst-kix_t4weiblbsu2z-7{list-style-type:none}ul.lst-kix_t4weiblbsu2z-6{list-style-type:none}ul.lst-kix_6mvjq2nlb9mn-8{list-style-type:none}ul.lst-kix_6mvjq2nlb9mn-7{list-style-type:none}ul.lst-kix_t4weiblbsu2z-8{list-style-type:none}ul.lst-kix_t4weiblbsu2z-3{list-style-type:none}ul.lst-kix_t4weiblbsu2z-2{list-style-type:none}ul.lst-kix_t4weiblbsu2z-5{list-style-type:none}ul.lst-kix_t4weiblbsu2z-4{list-style-type:none}.lst-kix_r24wq59i6ga6-1>li:before{content:"-  "}.lst-kix_r24wq59i6ga6-0>li:before{content:"-  "}.lst-kix_yyr651cmrtx7-4>li:before{content:"-  "}ul.lst-kix_r24wq59i6ga6-1{list-style-type:none}.lst-kix_yyr651cmrtx7-3>li:before{content:"-  "}ul.lst-kix_r24wq59i6ga6-0{list-style-type:none}.lst-kix_6mvjq2nlb9mn-8>li:before{content:"\0025a0  "}ul.lst-kix_r24wq59i6ga6-3{list-style-type:none}ul.lst-kix_r24wq59i6ga6-2{list-style-type:none}.lst-kix_yyr651cmrtx7-1>li:before{content:"-  "}.lst-kix_yyr651cmrtx7-2>li:before{content:"-  "}.lst-kix_6mvjq2nlb9mn-5>li:before{content:"\0025a0  "}.lst-kix_6mvjq2nlb9mn-4>li:before{content:"\0025cb  "}.lst-kix_6mvjq2nlb9mn-6>li:before{content:"\0025cf  "}.lst-kix_6mvjq2nlb9mn-3>li:before{content:"\0025cf  "}.lst-kix_6mvjq2nlb9mn-7>li:before{content:"\0025cb  "}.lst-kix_r24wq59i6ga6-7>li:before{content:"-  "}.lst-kix_r24wq59i6ga6-8>li:before{content:"-  "}ul.lst-kix_yyr651cmrtx7-5{list-style-type:none}ul.lst-kix_yyr651cmrtx7-4{list-style-type:none}ul.lst-kix_yyr651cmrtx7-3{list-style-type:none}ul.lst-kix_yyr651cmrtx7-2{list-style-type:none}ul.lst-kix_yyr651cmrtx7-1{list-style-type:none}.lst-kix_yyr651cmrtx7-5>li:before{content:"-  "}ul.lst-kix_yyr651cmrtx7-0{list-style-type:none}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_r24wq59i6ga6-2>li:before{content:"-  "}.lst-kix_yyr651cmrtx7-6>li:before{content:"-  "}.lst-kix_yyr651cmrtx7-7>li:before{content:"-  "}.lst-kix_r24wq59i6ga6-3>li:before{content:"-  "}.lst-kix_t4weiblbsu2z-8>li:before{content:"-  "}ul.lst-kix_yyr651cmrtx7-8{list-style-type:none}.lst-kix_r24wq59i6ga6-4>li:before{content:"-  "}ul.lst-kix_yyr651cmrtx7-7{list-style-type:none}.lst-kix_yyr651cmrtx7-8>li:before{content:"-  "}ul.lst-kix_yyr651cmrtx7-6{list-style-type:none}.lst-kix_6mvjq2nlb9mn-1>li:before{content:"\0025cb  "}.lst-kix_r24wq59i6ga6-5>li:before{content:"-  "}.lst-kix_t4weiblbsu2z-6>li:before{content:"-  "}.lst-kix_t4weiblbsu2z-7>li:before{content:"-  "}.lst-kix_6mvjq2nlb9mn-0>li:before{content:"\0025cf  "}.lst-kix_6mvjq2nlb9mn-2>li:before{content:"\0025a0  "}.lst-kix_t4weiblbsu2z-5>li:before{content:"-  "}.lst-kix_r24wq59i6ga6-6>li:before{content:"-  "}ol{margin:0;padding:0}table td,table th{padding:0}.c5{margin-left:72pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c3{margin-left:108pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c2{margin-left:36pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c0{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c4{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left;height:11pt}.c11{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c8{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c10{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c7{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c9{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c1{padding:0;margin:0}.c6{color:inherit;text-decoration:inherit}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c9"><p class="c10"><span class="c0">Participants:</span></p><p class="c10"><span class="c0">Giles Dubuc, Todd Reifsteck, Ilya Grigorik, Yoav Weiss, Philippe Le Hegaret, Steven Bougon, Vivek Sekhar, Ryosuke Niwa, Benjamin De Kosnick, Thomas Kelly, Nate Schloss, Nic Jansma</span></p><h2 class="c8" id="h.4o3b0vadvf9r"><span class="c11">Administrative</span></h2><ul class="c1 lst-kix_yyr651cmrtx7-0 start"><li class="c2 li-bullet-0"><span class="c0">[Philippe]: Ralph tried to talk to Tim, a week ago, and Tim came with a proposal. Ralph will come to TPAC at the f2f Tuesday after the break, to talk about High Resolution 2 (HR2). Context: privacy folks had some feedback on this spec, which we closed, but they formally objected to move HR-2 to next steps. So, at this point, we don’t have a decision, but it’s moving :-)</span></li></ul><p class="c4"><span class="c0"></span></p><h2 class="c8" id="h.g8xuvmz2vnw"><span class="c11">Design</span></h2><ul class="c1 lst-kix_t4weiblbsu2z-0 start"><li class="c2 li-bullet-0"><span class="c7"><a class="c6" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/1UdeTNTqJmixnz_6mzGs5me4ypF5nRVxQ6gS7Xc7MLKw/edit%23slide%3Did.g5e764ecbda_2_56&amp;sa=D&amp;source=editors&amp;ust=1613235268096000&amp;usg=AOvVaw0r6RT3Iup3MYE2b586fAJb">Signed Exchange, Bundles , Portals</a></span><span class="c0">, what it means for WebPerf. </span></li><li class="c2 li-bullet-0"><span class="c0">[yoav] wanted to talk about it at F2F. Anyway, Chrome wants to ship some APIs regarding this, though there is no consensus from other UA. here, we will talk about how it relates to perf.</span></li></ul><ul class="c1 lst-kix_t4weiblbsu2z-1 start"><li class="c5 li-bullet-0"><span class="c0"><b>Signed exchange</b>: goal is to decouple the “where it comes from” from “where it’s serves”. One issue is that it does not provide confidentiality (b.com knows that something from a.com was served). The browser treats it like an internal redirect.</span></li><li class="c5 li-bullet-0"><span class="c0"><b>Use case</b>: </span></li></ul><ul class="c1 lst-kix_t4weiblbsu2z-2 start"><li class="c3 li-bullet-0"><span class="c0"><b>Privacy preserving prefetch</b>: SXG allows services to prefetch without the origin to know about it</span></li><li class="c3 li-bullet-0"><span class="c0"><b>Offline PWA installs</b>: enables various offline caches (but problem with sign discovery). </span></li></ul><ul class="c1 lst-kix_t4weiblbsu2z-1"><li class="c5 li-bullet-0"><span class="c0"><b>Regarding Perf and SXG</b>: additional steps: the browser needs to download and verify the certificate chain (extra hop). Do we want to expose that the content came from SXG ? Can we expose the distributor ?</span></li></ul><ul class="c1 lst-kix_t4weiblbsu2z-2 start"><li class="c3 li-bullet-0"><span class="c0">[todd] The issue is against NavTiming. I assume it also applies to Resource Timing</span></li><li class="c3 li-bullet-0"><span class="c0">[yoav] We mainly talk about SXGs in the context of navigation responses, because of how they are used today, but theoretically can also apply to stand-alone resources. (e.g. for some CDN use cases)</span></li><li class="c3 li-bullet-0"><span class="c0">[Ilya] Nothing stops you from using SXG on a subresource, it’s just not a use-case we’ve seen tried.</span></li><li class="c3 li-bullet-0"><span class="c0">[todd] Feels it should be fixed in resource Timing not in navigation timing.</span></li><li class="c3 li-bullet-0"><span class="c0">[yoav] Probably a L3 issue, where we are planning to merge both specs, so it won’t matter much. But you’re right.</span></li><li class="c3 li-bullet-0"><span class="c0">[Ilya] Issue 107 . The non-controversial bit is exposing that something was served from an SXG. Exposing a validation timestamp would give us that.</span></li><li class="c3 li-bullet-0"><span class="c0">The bit we still need to figure out is how much we can expose about a specific distributor.</span></li><li class="c3 li-bullet-0"><span class="c0">[Ilya] content was distributed by X distributors. How do we know the perf of each distributor? We’re still working out details and what would be the privacy and security implications of that. But as a first step, we should define validation start (though clearly L3 work).</span></li><li class="c3 li-bullet-0"><span class="c0">[benjamin] Re 107: is it paused till WebPackaging folks figure out next step?</span></li><li class="c3 li-bullet-0"><span class="c0">[Ilya] More or less, but we should break down the issues (some controversial and some not)</span></li><li class="c3 li-bullet-0"><span class="c0">[benjamin] Do we just need to provide validation timing?</span></li><li class="c3 li-bullet-0"><span class="c0">[Ilya] we would add a step for validation which will let you know that you loading from the SXG, and how long the validation step took.</span></li><li class="c3 li-bullet-0"><span class="c0">[benjamin] Exposing certification validation time in SXG seems essential.</span></li><li class="c3 li-bullet-0"><span class="c0">[benjamin] Chrome devtools have this concept of internal redirect. Would love to see internal redirect defined as a new type of redirects.</span></li><li class="c3 li-bullet-0"><span class="c0">[Ilya] true, we call it “Internal redirect” though not currently spec’d</span></li><li class="c3 li-bullet-0"><span class="c0">[benjamin] Need to be spec’d. Bring it on at TPAC ?</span></li><li class="c3 li-bullet-0"><span class="c0">[Ilya] First use case for “Internal redirect” in Chromium is HSTS</span></li><li class="c3 li-bullet-0"><span class="c0">[benjamin] yeah, let’s talk about “Internal redirect” to make it a standard. </span></li><li class="c3 li-bullet-0"><span class="c0">[Ilya] Also, we’ve seen cases where internal redirects take a lot of time, so need to be measured</span></li><li class="c3 li-bullet-0"><span class="c0">[benjamin] yeah, same here for cert validation</span></li><li class="c3 li-bullet-0"><span class="c0">[ryosuke] We are implementing HSTS in the CFNetwork library, but SXG will not be implemented there. So if they are both using the same mechanism, that may cause implementation challenges. </span></li><li class="c3 li-bullet-0"><span class="c0">[benjamin] The terms transport origin and certificate origins seem to be new terminology, where are they defined ?</span></li><li class="c3 li-bullet-0"><span>[yoav] Defined in the </span><span class="c7"><a class="c6" href="https://www.google.com/url?q=https://github.com/WICG/webpackage&amp;sa=D&amp;source=editors&amp;ust=1613235268099000&amp;usg=AOvVaw3ljJrfdjPjf2oljp86zoEs">WebPackaging WICG repo</a></span><span class="c0">. Discussions on creating an IETF WG for that</span></li><li class="c3 li-bullet-0"><span>[benjamin] Seems of great importance to properly define these new concepts</span></li><li class="c3 li-bullet-0"><span>[benjamin] One more question - why do we want to hide resource fetches from the origin?</span></li><li class="c3 li-bullet-0"><span class="c0">[yoav] Resource prefetch. Prefetching resource before user has shown interest (eg: site a.com have links to b.com, c.com. Site a.com wants to prefetch these links. Prefetching might leak some intent that the user hasn’t expressed yet). For example, google search result might want to prefetch sites without the sites knowing it.</span></li><li class="c3 li-bullet-0"><span class="c0">[benjamin] The user didn’t ask for those prefetches, so that’s not a user problem we’re solving. </span></li><li class="c3 li-bullet-0"><span class="c0">[yoav] Performance is the user’s problem. Cross-origin prefetch solves a real performance problem, and doing it privately requires something like SXG as a primitive.</span></li><li class="c3 li-bullet-0"><span class="c0">[benjamin] can a user turn off prefetching?</span></li><li class="c3 li-bullet-0"><span class="c0">[Ilya] really good (product) question. Let’s defer that to the SXG people (who will be in TPAC)</span></li><li class="c3 li-bullet-0"><span class="c0">[todd] It’s possible from fetch to do CO requests. It’s not a new privacy leak</span></li><li class="c3 li-bullet-0"><span class="c0">[yoav] not new. SXG makes cross-origin requests less privacy invasive</span></li></ul><ul class="c1 lst-kix_t4weiblbsu2z-0"><li class="c2 li-bullet-0"><span class="c0">Bundles Exchange</span></li></ul><ul class="c1 lst-kix_t4weiblbsu2z-1 start"><li class="c5 li-bullet-0"><span class="c0">Bundled exchange is a concept that used to be with SXG, but now is split. It’s very similar to multi-part resource bundle, but it’s not awful. Various use case:</span></li></ul><ul class="c1 lst-kix_t4weiblbsu2z-2 start"><li class="c3 li-bullet-0"><span class="c0">Prefetch for sub-resources</span></li><li class="c3 li-bullet-0"><span class="c0">More performant for ES module</span></li><li class="c3 li-bullet-0"><span class="c0"><b>PWA in app store</b>: still from origin, but delivered by the app store</span></li></ul><ul class="c1 lst-kix_t4weiblbsu2z-1"><li class="c5 li-bullet-0"><span class="c0">Resource Timing:</span></li></ul><ul class="c1 lst-kix_t4weiblbsu2z-2 start"><li class="c3 li-bullet-0"><span class="c0">We will know if it served from a bundle or not</span></li><li class="c3 li-bullet-0"><span class="c0">Bundles are progressively parsed. We are introducing the parsing over-head of bundles as something that will impact individual resource’s start and end times</span></li></ul><ul class="c1 lst-kix_t4weiblbsu2z-1"><li class="c5 li-bullet-0"><span class="c0">[todd] are you talking about client side parsing or server-side + range requests? can range requests work with bundles?</span></li><li class="c5 li-bullet-0"><span class="c0">[yoav] I’m speaking of client side parsing. Range requests can work but once you compress the bundle as a single resource, but then all bets are off for range requests.</span></li><li class="c5 li-bullet-0"><span class="c0">[yoav] The scenario to consider is navigation for foo.html (containing foo.js, etc). Browser receives the bundle. See that it gets foo.html, mark the timestamp, and only then gets foo.js, even though the overall bundle may still continue loading. So we are mixing download and parsing time.</span></li><li class="c5 li-bullet-0"><span class="c0">[todd] but if I ask for a subset of the bundle ?</span></li><li class="c5 li-bullet-0"><span class="c0">[yoav] not sure if a portion of a bundle can be parsed out of context. Jeffrey Yasskin is the person to talk to for details on that.</span></li><li class="c5 li-bullet-0"><span class="c0">[todd] If it downloads the whole bundle, and we get foo.html, and at that point mark that resource’s start time. Doesn’t quite fit the model we have today</span></li><li class="c5 li-bullet-0"><span class="c0">[yoav] Yeah, at least if we want to be getting the granularity we have today. </span></li><li class="c5 li-bullet-0"><span class="c0">[todd] so if we just expose the bundle start and end time, it will hide subresource timing, and potential slowness if the bundles are built in a streaming server. Is that information needed?</span></li><li class="c5 li-bullet-0"><span class="c0">[yoav] Format doesn’t support building on-the-fly, only on-the-fly subsetting. Otherwise, if we don’t expose start and end time, then we have a monolith bundle and we will hide all the internal bundle, so we will never know why a JS did not start the parsing on time. In the extreme, a site delivered over a single bundle will have the same start and end times for all subresources.</span></li><li class="c5 li-bullet-0"><span class="c0">[todd] it’s like inlining JS, you don’t have the information</span></li><li class="c5 li-bullet-0"><span class="c0">[yoav] correct. But not ideal</span></li><li class="c5 li-bullet-0"><span class="c0">[todd] Sure, but how urgent is it?</span></li><li class="c5 li-bullet-0"><span class="c0">[nic] our customers would like to know which resource is large, small, came with the bundle</span></li><li class="c5 li-bullet-0"><span class="c0">[todd] today, we don’t know parse time. It can start any time. With bundle, we will lose information. But trying to see if timing here is really needed.</span></li><li class="c5 li-bullet-0"><span class="c0">[yoav] yes, in-bundle timing is needed as much as resource timing is needed. If a bundle is bloated or mis-ordered the bundle, you’d want to know. Needs more thought. </span></li><li class="c5 li-bullet-0"><span class="c0">[todd] Should we talk about exposing parse time in general?</span></li><li class="c5 li-bullet-0"><span class="c0">Here, we should talk about exposing the parse time of the bundle, for resource discovery (not the JS itself).</span></li><li class="c5 li-bullet-0"><span class="c0">[nic] would there be info about bundle content not used by the page</span></li><li class="c5 li-bullet-0"><span class="c0">[yoav] in today’s model, resources in the bundle but not on the page won’t be exposed</span></li><li class="c5 li-bullet-0"><span class="c0">[todd] Would a resource in a bundle also have an RT entry?</span></li><li class="c5 li-bullet-0"><span class="c0">[yoav] it should be</span></li></ul><p class="c4"><span class="c0"></span></p><h2 class="c8" id="h.82lvo3mmaaoq"><span class="c11">TPAC</span></h2><ul class="c1 lst-kix_69lh9mjvobix-0 start"><li class="c2 li-bullet-0"><span>Agenda is </span><span class="c7"><a class="c6" href="https://www.google.com/url?q=https://docs.google.com/document/d/1-xMvUHAjqhQdegNqupxlqsLbfPHWq5MJ0iySg9Z1KBs/edit%23&amp;sa=D&amp;source=editors&amp;ust=1613235268104000&amp;usg=AOvVaw1L_TlGRXJ92tVReTBXecyx">here</a></span><span class="c0">.</span></li><li class="c2 li-bullet-0"><span class="c0">Monday for designs and Tuesday for issue discussion and progress</span></li><li class="c2 li-bullet-0"><span class="c0">[benjamin] LCP implementation experience session?</span></li><li class="c2 li-bullet-0"><span class="c0">[steven] metrics for SPA?</span></li><li class="c2 li-bullet-0"><span class="c0">[yoav] We should block a couple of hours for that. Also, a related discussion about resetting the history API which may be related.</span></li><li class="c2 li-bullet-0"><span class="c0">[Ilya] Also - CompressStream. Exposing an api to compress the data on the client. Incubated in Japan team in Chrome. We should try to schedule</span></li><li class="c2 li-bullet-0"><span class="c0">[nate] planning to join that effort. Andrew was hoping to talk about that</span></li><li class="c2 li-bullet-0"><span class="c0">[nate] isInputPending: is there a consensus to go from WICG -&gt; WebPerf?</span></li><li class="c2 li-bullet-0"><span class="c0">[yoav] so admin discussion</span></li><li class="c2 li-bullet-0"><span class="c0">[todd] Is there something about isRenderingPending?</span></li><li class="c2 li-bullet-0"><span>[yoav] I can check with Stefan Zager</span></li><li class="c2 li-bullet-0"><span class="c0">[todd] Also for Frame Timing, let’s schedule it late so Noam can join</span></li><li class="c2 li-bullet-0"><span class="c0">[yoav] Maybe we can do 1½ day for Design, ½ day for issue, if not a lot of issues to discuss.</span></li><li class="c2 li-bullet-0"><span class="c0">[todd] people may want to some in-person work/spec reviews</span></li><li class="c2 li-bullet-0"><span class="c0">[yoav] sure, but that doesn’t require the entire group</span></li><li class="c2 li-bullet-0"><span class="c0">[benjamin] makes sense to prioritize design where we’d be getting a large amount of cross-section collaboration</span></li></ul><p class="c4"><span class="c0"></span></p></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjozfXGiu7_fyFkJs6wSC_TP8_Hzd_hrhwUyWOfPhLdnbkMXjzXwxce17ZP_7Fwe7UFG5QKLpn2z3RR0Kl4s:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>